package net.eyra.struts.actions;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.eyra.negocio.dao.EyraDaoException;
import net.eyra.negocio.entidades.gestion.direccion.Direccion;
import net.eyra.negocio.entidades.gestion.propietarios.CuentaBancaria;
import net.eyra.negocio.entidades.gestion.propietarios.EstadoPropietario;
import net.eyra.negocio.entidades.gestion.propietarios.Propiedad;
import net.eyra.negocio.entidades.gestion.propietarios.Propietario;
import net.eyra.negocio.propietarios.Propietarios;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import com.google.gson.Gson;

public class PropietarioAction extends DispatchAction {

    private Propietarios propietarios = new Propietarios();

    public ActionForward CargarPropietarios(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
                                                                                                                                             throws IOException {

        try {
            List<Propietario> _propietarios = propietarios.ListaNombrePropietarios();

            Gson json = new Gson();

            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/plain");
            response.getWriter().write(json.toJson(_propietarios));
        } catch (EyraDaoException e) {
        }
        return null;
    }

    public ActionForward CargarEstadosPropietario(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
                                                                                                                                                   throws IOException {

        try {
            List<EstadoPropietario> _estados = propietarios.ListaEstadosPropietario();

            Gson json = new Gson();

            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/plain");
            response.getWriter().write(json.toJson(_estados));
        } catch (EyraDaoException e) {
        }
        return null;
    }

    public ActionForward CargarDatosPropietario(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
                                                                                                                                                 throws IOException {

        int id_propietario = Integer.parseInt(request.getParameter("id_propietario"));

        try {
            Propietario propietario = propietarios.DatosPropietario(id_propietario);

            CargarDatosAjax(propietario, response);

        } catch (EyraDaoException e) {
        }

        return null;
    }

    private void CargarDatosAjax(Propietario propietario, HttpServletResponse response) throws IOException {
        for (CuentaBancaria cuenta_bancaria : propietario.getCuentas_bancarias())
            cuenta_bancaria.setPropietario(null);

        for (Propiedad propiedad : propietario.getPropiedades()) {
            propiedad.setPropietario(null);
            propiedad.getFinca().setPropietarios(null);
            propiedad.getFinca().setAfecciones(null);
            propiedad.getFinca().getParque().setFincas(null);
            propiedad.getFinca().getParque().setAcuerdos(null);
            propiedad.getFinca().getParque().setSociedad_factura(null);
            propiedad.getFinca().getParque().setSociedades(null);
            propiedad.getFinca().getParque().setTarificadores(null);
        }

        Gson json = new Gson();
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/plain");
        response.getWriter().write(json.toJson(propietario));
    }

    public ActionForward GuardarDatosPropietario(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
                                                                                                                                                  throws IOException {

        try {
            int id_propietario = Integer.parseInt(request.getParameter("id_propietario"));

            Propietario propietario = propietarios.DatosPropietario(id_propietario);

            String es_sociedad = request.getParameter("es_sociedad").toUpperCase();
            String nombre_sociedad = "";
            String nombre = "";
            String apellido1 = "";
            String apellido2 = "";

            String nif = request.getParameter("nif").toUpperCase();
            nombre = request.getParameter("nombre").toUpperCase();
            if (es_sociedad.equals("N")) {
                apellido1 = request.getParameter("apellido1").toUpperCase();
                apellido2 = request.getParameter("apellido2").toUpperCase();
            }
            int id_estado_propietario = Integer.parseInt(request.getParameter("id_estado_propietario"));
            String generar_factura = request.getParameter("generar_factura");
            String generar_iva = request.getParameter("generar_iva");
            int numero_pagos_anno = Integer.parseInt(request.getParameter("numero_pagos_anno"));
            String observaciones = request.getParameter("observaciones");

            propietario.setNif(nif);
            propietario.setNombre_sociedad(nombre_sociedad);
            propietario.setNombre(nombre);
            propietario.setApellido1(apellido1);
            propietario.setApellido2(apellido2);
            propietario.setEstado_propietario(propietarios.CargarEstadoPropietario(id_estado_propietario));
            propietario.getDatos_facturacion().setGenerar_factura(generar_factura);
            propietario.getDatos_facturacion().setGenerar_iva(generar_iva);
            propietario.getDatos_facturacion().setNumero_pagos_anno(numero_pagos_anno);
            propietario.setObservaciones(observaciones);
            propietario.setSociedad(es_sociedad);

            String calle = request.getParameter("calle");
            String codigo_postal = request.getParameter("codigo_postal");
            String poblacion = request.getParameter("poblacion");
            int id_provincia = Integer.parseInt(request.getParameter("id_provincia"));
            int id_pais = Integer.parseInt(request.getParameter("id_pais"));

            String calle_factura = request.getParameter("calle_factura");
            String codigo_postal_factura = request.getParameter("codigo_postal_factura");
            String poblacion_factura = request.getParameter("poblacion_factura");
            int id_provincia_factura = Integer.parseInt(request.getParameter("id_provincia_factura"));
            int id_pais_factura = Integer.parseInt(request.getParameter("id_pais_factura"));

            Direccion direccion = propietario.getDireccion();
            Direccion direccion_factura = propietario.getDatos_facturacion().getDireccion();

            direccion.setCalle(calle.toUpperCase());
            direccion.setCodigo_postal(codigo_postal.toUpperCase());
            direccion.setPoblacion(poblacion.toUpperCase());
            direccion.getProvincia().setId_provincia(id_provincia);
            direccion.getProvincia().getPais().setId_pais(id_pais);

            direccion_factura.setCalle(calle_factura.toUpperCase());
            direccion_factura.setCodigo_postal(codigo_postal_factura.toUpperCase());
            direccion_factura.setPoblacion(poblacion_factura.toUpperCase());
            direccion_factura.getProvincia().setId_provincia(id_provincia_factura);
            direccion_factura.getProvincia().getPais().setId_pais(id_pais_factura);

            propietario.setDireccion(direccion);
            propietario.getDatos_facturacion().setDireccion(direccion_factura);

            propietarios.GrabarPropietario(propietario);

            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/plain");
            response.getWriter().write("success");
        } catch (Exception e) {
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/plain");
            response.getWriter().write(e.toString());
        }

        return null;
    }

    public ActionForward GuardarCuentaBancariaPropietario(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                                                          HttpServletResponse response) throws IOException {

        String es_cta_esp = request.getParameter("es_cta_esp").toUpperCase();
        int id_propietario = Integer.parseInt(request.getParameter("id_propietario"));
        String cta_bancaria = request.getParameter("cta_bancaria").trim();

        try {
            Propietario propietario = propietarios.DatosPropietario(id_propietario);
            Date fecha = new Date(System.currentTimeMillis());

            CuentaBancaria cta_act = propietario.getCuentaBancariaActiva();
            if (cta_act != null) {
                cta_act.setActiva("N");
                cta_act.setFecha_baja(fecha);
                propietarios.GrabarCuentaBancaria(cta_act);
            }

            CuentaBancaria cta_ban = new CuentaBancaria();
            cta_ban.setPropietario(propietario);
            cta_ban.setActiva("S");
            cta_ban.setCta_bancaria(cta_bancaria);
            cta_ban.setCta_española(es_cta_esp);
            cta_ban.setFecha_alta(fecha);
            propietarios.GrabarCuentaBancaria(cta_ban);

            List<CuentaBancaria> cuentas = propietario.getCuentas_bancarias();
            if (cuentas == null) cuentas = new ArrayList<CuentaBancaria>();
            cuentas.add(cta_ban);
            propietario.setCuentas_bancarias(cuentas);
            propietarios.GrabarPropietario(propietario);

            CargarDatosAjax(propietario, response);

        } catch (EyraDaoException e) {
        }

        return null;
    }
}